# from itsdangerous import TimedJSONWebSignatureSerializer#Serializer序列化（把对象变成字节（二进制数据））
from jwt import PyJWTError

from comment.utils import const
from flask import current_app
from comment.models.user import User
import jwt
from datetime import datetime,timedelta
def generate_tokens(uid):
    """
    根据已经登陆的用户id，生成token
    :param uid:用户id
    :return:
    """
    payload={
        'id':uid,
        'exp':datetime.utcnow()+timedelta(seconds=const.JWT_EXPIRY_SECOND)
    }
    #参数1：secret_key密钥（哈希算法是可逆的 所以添加密钥增加安全性） expires_in会话过期时间
    s=jwt.encode(payload=payload,key=const.SECRET_KEY,algorithm='HS256')#HS256表示的是算法的名字 256表示token的长度
    #生成token
    return s



def verify_tokens(token_str):
    """
    验证token，并且验证成功之后返回用户的id（）
    :param token_str:
    :return:
    """


    try:
        data=jwt.decode(token_str,key=const.SECRET_KEY,algorithms='HS256')#本质上就是一个解密过程
        current_app.logger.info(data)
    except PyJWTError as e:
        current_app.logger.info(e)#将错误打印出来
        return {'message':'token是非法的 验证失败'}

    #如果没有验证失败 解密之后会有一个用户id 还需要看看当前用户状态是否正常
    user=User.query.filter(User.id==data['id']).first()
    if user and user.status !=0:#状态0表示正常
        return {'message':'数据库中的用户状态过期'}

    return {'id':user.id}

